package java0328;

import java.util.*;

public class MapAndSet {

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        // 1. 使用 put 方法插入键值对
        //    Map 内部的元素之间的先后顺序和插入顺序关系不大~
        //    当 put 的时候发现 key 已经存在, 此时就会覆盖原有的 value
//        map.put("及时雨", "宋江");
//        map.put("黑旋风", "李逵");
        map.put("行者", "武松");
        map.put("及时雨", "宋公明");
//        map.put("小李广", "花荣");
//        System.out.println(map);
        // 2. 使用 get 方法, 根据 key 获取 value
        //    如果 key 不存在, get 返回 null
        //    还可以使用 getOrDefault 来根据 key 获取 value
        //    如果 key 不存在, getOrDefault 返回一个默认值, 并不会添加新的键值对
//        String value = map.get("行者");
//        System.out.println(value);
//        value = map.get("小李广");
//        System.out.println(value);
//        value = map.getOrDefault("小李广", "花荣");
//        System.out.println(value);
//        System.out.println(map);

        // 3. 使用 isEmpty 判定空
//        System.out.println(map.isEmpty());
//        // 4. 使用 size 获取到键值对的个数
//        System.out.println(map.size());
        // 5. 使用 clear 清空所有的键值对
//        map.clear();
//        System.out.println(map.isEmpty());
//        System.out.println(map.size());
        // 6. 遍历 Map (Map 设计出来不是为了遍历!!)
        //    遍历 Map 是比较复杂的, 需要把 Map 转换成 Set 再遍历
//        for (Map.Entry<String, String> entry : map.entrySet()) {
//            System.out.println(entry.getKey() + ": " + entry.getValue());
//        }
        // 7. 还可以单独的获取到所有的 key 和所有的 value
//        for (String key : map.keySet()) {
//            System.out.println(key);
//        }
//        for (String value : map.values()) {
//            System.out.println(value);
//        }



        Set<String> set = new HashSet<>();
//        // 1. 使用 add 插入元素
//        //    如果插入重复的 key, 实际只保存一份
//        //    借助 Set 的这个特性, 就可以用于 "去重"
//        set.add("C");
//        set.add("C++");
//        set.add("C++");
//        set.add("Java");
//        set.add("Python");
//        System.out.println(set);
//        // 2. 使用 contains 方法判定元素是否存在 [重要]
//        boolean ret = set.contains("java");
//        System.out.println(ret);
//        // 3. 使用 remove 删除元素
//        set.remove("Java");
//        System.out.println(set);
        // Set 中的元素不能改~~ 如果非要改, 删掉再插入新的就好了
        // 4. 使用 isEmpty 来判定空
//        System.out.println(set.isEmpty());
        // 5. 使用 size 获取元素个数
//        System.out.println(set.size());
        // 6. 使用 clear 清空元素
//        set.clear();
//        System.out.println(set.isEmpty());
//        System.out.println(set.size());

        // 7. 遍历
        //  a) 直接使用 for-each 遍历 [语法糖]
        //     啥样的类能使用 for-each??
        //     如果这个类能支持迭代器就可以 for-each
        //     实现了 Iterable 接口
//        for (String key : set) {
//            System.out.println(key);
//        }
//        //  b) 使用迭代器来遍历
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}
